/*
 * MIT License
 *
 * Copyright (c) 2023-present, tangli
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package tony.mybatis.datascope

import tony.mybatis.datascope.model.ScopedColumn
import tony.mybatis.datascope.model.ScopedTable

/**
 * 提供数据权限上下文.
 * 定义获取数据权限相关变量的方法, 给出默认值.
 * @author tangli
 * @date 2025/09/16 16:47
 */
public interface IDataScopeProvider {
    /**
     * 默认用户id.
     * 一般取当前登录用户
     * @return [String]
     * @author tangli
     * @date 2025/09/17 09:40
     */
    public val userIdList: Collection<String>
        get() = LinkedHashSet()

    /**
     * 组织 id 列表.
     * 针对多组织的情况.
     * @return [Collection]<[String]>
     * @author tangli
     * @date 2025/09/17 09:42
     */
    public val orgIdList: Collection<String>
        get() = LinkedHashSet()

    /**
     * 要处理的表
     * @return [Set]<[String]>
     * @author tangli
     * @date 2025/09/17 10:32
     */
    public val tables: Collection<ScopedTable>

    /**
     * 用户id列名称.
     * @author tangli
     * @date 2025/09/17 10:32
     */
    public val userIdColumn: String

    /**
     * 组织id列名称.
     * @author tangli
     * @date 2025/09/17 10:32
     */
    public val orgIdColumn: String

    /**
     * 新用户id列
     * @param [userIdColumn] 用户id列名
     * @return [ScopedColumn]
     * @author tangli
     * @date 2025/09/20 21:40
     */
    public fun newUserIdColumn(userIdColumn: String): ScopedColumn =
        ScopedColumn(
            "",
            userIdColumn,
            orgIdColumn
        )

    /**
     * 新用户id列
     * @param [userIdColumn] 用户id列名
     * @param [tableAlias] 对应表别名
     * @return [ScopedColumn]
     * @author tangli
     * @date 2025/09/20 21:40
     */
    public fun newUserIdColumn(
        userIdColumn: String,
        tableAlias: String,
    ): ScopedColumn =
        ScopedColumn(
            tableAlias,
            userIdColumn,
            orgIdColumn
        )

    /**
     * 新组织id列
     * @param [orgIdColumn] 组织id列名
     * @return [ScopedColumn]
     * @author tangli
     * @date 2025/09/20 21:40
     */
    public fun newOrgIdColumn(orgIdColumn: String): ScopedColumn =
        ScopedColumn(
            "",
            userIdColumn,
            orgIdColumn
        )

    /**
     * 新组织id列
     * @param [orgIdColumn] 组织id列名
     * @param [tableAlias] 对应表别名
     * @return [ScopedColumn]
     * @author tangli
     * @date 2025/09/20 21:40
     */
    public fun newOrgIdColumn(
        orgIdColumn: String,
        tableAlias: String,
    ): ScopedColumn =
        ScopedColumn(
            tableAlias,
            userIdColumn,
            orgIdColumn
        )
}
